package com.LeeCode;

/**
 * 统计数组中峰和谷的数量
 */

public class Code2210 {
    public static void main(String[] args) {
        int[] nums = {2, 4, 1, 1, 6, 5};
        System.out.println(new Code2210().countHillValley(nums));
    }

    public int countHillValley(int[] nums) {
        int ans = 0, n = nums.length;

        for (int i = 1; i < n - 1; i++) {
            // 跳过与前一个元素相同的元素
            if (nums[i] == nums[i - 1]) {
                continue;
            }

            // 找到左侧最近的不相等元素
            int left = i - 1;
            while (left >= 0 && nums[left] == nums[i]) {
                left--;
            }

            // 找到右侧最近的不相等元素
            int right = i + 1;
            while (right < n && nums[right] == nums[i]) {
                right++;
            }

            // 确保左右邻居都存在
            if (left >= 0 && right < n) {
                // 峰：大于左右邻居
                // 谷：小于左右邻居
                if ((nums[i] > nums[left] && nums[i] > nums[right]) ||
                        (nums[i] < nums[left] && nums[i] < nums[right])) {
                    ans++;
                }
            }
            i = right - 1;
        }

        return ans;
    }
}
